package org.leetcode.easy;

import org.junit.Test;

/***
 * 190. 颠倒二进制位
 * 颠倒给定的 32 位无符号整数的二进制位。
 */
public class ReverseBits {
        /**
         * 颠倒给定的 32 位无符号整数的二进制位。
         * 从小到大逐个颠倒，将n与1进行按位与操作，得到的数不是0 就是 1，将结果左移 与rev进行按位或运算，在记录在rev中。
         * 由于每次左移后的结果出左移的那一位是0或者1，其他皆为0，所以与rev按位或运算不会对其他位造成影响。
         *
         * 然后将n右移，直到n为0。
         * @param n
         * @return 返回颠倒后的无符号整数
         */
        public int reverseBits(int n) {
            int rev = 0;
            for (int i = 0; i < 32 && n != 0; ++i) {
                // & 按位与 操作符 任何一个数 & 1 结果都是 0 或 1
                // | 按位或 操作符
                rev |= (n & 1) << (31 - i);
                // 按位右移补零操作符 降位操作，是最后一位数永远是要操作的数。
                n >>>= 1;
            }
            return rev;
        }
    @Test
    public void test() {

    }
}
